using System;
using Rhino.Mocks;

namespace CleanTest
{
    public interface ITestConstruct<TInput, TOuptut>
    {
        ITestConstruct<TInput, TOuptut> WhenICall(Func<TInput, TOuptut> functionUnderTest);
        ITestConstruct<TInput, TOuptut> With(TInput input);

        void ExpectThatICall<TDependency>(TDependency mock, Action<TDependency> action)
            where TDependency : class;

        void ExpectThatICall<TDependency, TDependencyOutput>(TDependency mock, Function<TDependency, TDependencyOutput> expectedFunction,
                                                             TDependencyOutput dependencyOutput)
            where TDependency : class;

        void ExpectThatINeverCall<TDependency>(TDependency mock, Action<TDependency> action)
            where TDependency : class;

        void AssertOutputIsSatifiedBy(Func<TOuptut, bool> predicate);
        void AnExceptionIsExpected<T>() where T : Exception;
    }
}